from django.shortcuts import render,HttpResponse,redirect
from django import forms

from app01 import models
from app01.utils.bootstrap import BootStrapForm
from app01.utils.encrypt import md5
from app01.utils.code import check_code

class LoginForm(BootStrapForm):
    username = forms.CharField(
        label="用户名1",
        widget=forms.TextInput,
        required=True
    )
    password = forms.CharField(
        label="密码",
        # 显示输入的隐藏默认密码
        widget=forms.PasswordInput(render_value=True),
        required=True
    )
    # 通过ModelForm获取验证码
    code = forms.CharField(
        label="验证码",
        widget=forms.TextInput,
        required=True
    )
    # 通过钩子方法，得到密文，然会出去到数据库做校验
    def clean_password(self):
        pwd = self.cleaned_data.get("password")
        return md5(pwd)
    # # 继承bootstrap样式
    # def __init__(self, *args, **kwargs):
    #     super().__init__(*args, **kwargs)
    #     # 循环ModelForm中的所有字段，给每个字段做widget插件，添加了class="form-control"
    #     for name,field in self.fields.items():
    #         # 字段有属性，保留原来的属性，没有属性，才增加
    #         if field.widget.attrs:
    #             field.widget.attrs["class"] = "form-control"
    #             field.widget.attrs["placeholder"] = field.label
    #         else:
    #             # 加"placeholder": field.label，输入框显示提示信息
    #             field.widget.attrs = {
    #                 "class": "form-control",
    #                 "placeholder": field.label
    #             }
def login(request):
    """ 登录 """
    if request.method == "GET":
        form = LoginForm()
        return render(request,'login.html',{"form":form})
    form = LoginForm(data=request.POST)
    if form.is_valid():
        # 验证成功，获取到用户名和密码
        # {'username': '123456', 'password': '123',"code": 123}
        # print(form.cleaned_data)

        # 使用Pop方法，获取code，并再session中剔除code，因为username和password要做校验的
        user_input_code = form.cleaned_data.pop('code')
        code = request.session.get('image_code',"")
        # upper大写
        if code.upper() != user_input_code.upper():
            form.add_error("code","验证码错误")
            return render(request,'login.html',{"form":form})

        # 去数据库校验用户名和密码是否正确，获取用户对象
        admin_object =models.Admin.objects.filter(**form.cleaned_data).first()
        if not admin_object:
            # form.add_error("username","用户名或密码错误")
            form.add_error("password", "用户名或密码错误")
            return render(request,'login.html',{"form":form})
        # 用户名和密码正确
        # 应用Cookie和Session，网站生成随机字符春，写到用户浏览器的Cookie中，再写到Session中，Django默认是在数据库中
        # 已字典的形式把用户的ID和用户名存入Session中
        request.session["info"] = {'id': admin_object.id,'name':admin_object.username}
        # session可以保存7天，7天免登录
        request.session.set_expiry(60*60*24*7)
        # 登录成功，重定向一个页面
        return redirect("/admin/list/")
    return render(request,'login.html',{"form":form})

# 将生成的图片写入内存中，导入包
from io import BytesIO

def image_code(request):
    """生成图片验证码"""
    # 调用pillow函数check_code(),生成图片
    img, code_string = check_code()
    # print(code_string)

    # 写入到自己的session中，以便于后续获取验证码再进行校验
    request.session["image_code"] = code_string
    # 给session设置60秒超时，要想更严谨，就把这个60秒设置去掉
    request.session.set_expiry(60)

    # 借助BytesIO包，将图片声称在内存中
    stream = BytesIO()
    img.save(stream, 'png')

    return HttpResponse(stream.getvalue())

def logout(request):
    """注销"""
    request.session.clear()
    return redirect("/login/")

# def favicon(request):
#     return HttpResponse("<img src='/static/img/favicon.png' />")
